<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
	</head>
	<body>
		<script type="text/javascript">
			// var n = new Number();
			// // n指的是个对象和构造函数做对比 返回的是true
			// console.log(n.__proto__ === Number.prototype)
			
			// // Number的构造函数指的是function, 那就Number是Function的实例 
			// console.log(Number.__proto__ === Function.prototype)
			// // 以上一整个原型与原型层层相链接的过程即为原型链
			// console.log(n)
			
			
			
			
			// 在构造函数中定义属性
			function Proson(n,a){
				this.uname = n;
				this.age = a;
				// 可以调用下面方法
				this.f = name;
			}
			// 在原型中定义方法
			Proson.prototype.sayHi = function(){
				console.log('dajiahao');
			}
			// 也可以直接定义一个函数
			function name(){
				console.log('hahaha')
			}
			
			
			// 实例化对象
			let p = new Proson('xiaoming',18);
			let o = new Proson('xiaolaji',20);
			// 测试
			// 调用在外面调用的函数
			p.f();
			console.log(p.sayHi === o.sayHi);   //true
			// 原型上面的prototype 和实例化的__proto__指向是一样的
			console.log(Proson.prototype === p.__proto__);   //true
			
			
			// 引用类型都存在__proto__属性   对象 数组 函数 都是引用类型
			
			let obj = {};
			
			// 如何通过对象找它的构造函数
			// 1,通过__proto__可以找到原型对象
			// 2,通过原型对象中的constructor可以找到构造函数 == Object
			
			// let obj = new Object();   //这行就相当于上面的代码
			console.dir(obj)
		</script>
	</body>
</html>
